package SIC.Modele.DataBDD;

import java.util.Arrays;
import java.util.List;

import javax.persistence.EntityManager;
import javax.persistence.Persistence;

import SIC.Modele.Composition;
import SIC.Modele.Data;
import SIC.Modele.Produit;

/**
 * Cette classe permet de créer et récupérer des données dans notre BDD
 */
public class DataBDD extends Data {

	private EntityManager em;
	
	public DataBDD(String nomPU) {
		super();
		this.em = Persistence.createEntityManagerFactory(nomPU).createEntityManager();
	}
	
	/**
	 * Crée les tables :
	 * - produit : contient les produits
	 * - composition contient l'id des compositions (produitID)
	 * - composition_produit contient les compositions (produit + composants)
	 */
    public void creerEtPeuplerTables()
    {
		em.getTransaction().begin();
		
		//Les produits
		ProduitORM p1 = new ProduitORM("P1","Stylo");
		ProduitORM p2 = new ProduitORM("P2","Capuchon");
		ProduitORM p3 = new ProduitORM("P3","Corps");
		ProduitORM p4 = new ProduitORM("P4","Tube");
		ProduitORM p5 = new ProduitORM("P5","Recharge");
		ProduitORM p6 = new ProduitORM("P6","Bouchon");
		ProduitORM p7 = new ProduitORM("P7","Tete-d-ecriture");
		ProduitORM p8 = new ProduitORM("P8","Reservoir");
		ProduitORM p9 = new ProduitORM("P9","Support-de-tete");
		ProduitORM p10 = new ProduitORM("P10","Tete");
		ProduitORM p11 = new ProduitORM("P11","Bille");
		
		em.persist(p1);
		em.persist(p2);
		em.persist(p3);
		em.persist(p4);
		em.persist(p5);
		em.persist(p6);
		em.persist(p7);
		em.persist(p8);
		em.persist(p9);
		em.persist(p10);
		em.persist(p11);

		//Les compositions	
		CompositionORM compP1 = new CompositionORM("P1",Arrays.asList(p2,p3));
		CompositionORM compP3 = new CompositionORM("P3",Arrays.asList(p4,p5,p6,p7));
		CompositionORM compP5 = new CompositionORM("P5",Arrays.asList(p9));
		CompositionORM compP7 = new CompositionORM("P7",Arrays.asList(p10,p11));
		
		em.persist(compP1);
		em.persist(compP3);
		em.persist(compP5);
		em.persist(compP7);

		em.getTransaction().commit();
		
		em.clear();
		
		getMapProduits();
		getMapCompositions();
		
    }
    
    
    /**
     * Récupère les ProduitORM dans la BDD et les convertit en Produit
     * Récupère les CompositionORM dans la BDD et les convertit en Composition
     */
	@SuppressWarnings("unchecked")
	@Override
	public void initData(){
		
		if(mapProduits.isEmpty() || mapCompositions.isEmpty())
		{
			List<ProduitORM> produitsORM = em.createQuery("SELECT p FROM Produit p").getResultList();
			
			for(ProduitORM produitORM : produitsORM)
				mapProduits.put(produitORM.getProduitID(), new Produit(produitORM));
			
			List<CompositionORM> listeComposORM = em.createQuery("SELECT c FROM Composition c").getResultList();
			
			for(CompositionORM compoORM : listeComposORM)
				mapCompositions.put(compoORM.getProduitID(), new Composition(compoORM));
		}
		
	}
}
